import Vue from 'vue'
import axios from 'axios'
import {userRules} from './directives.user.config.js'
/*
 * 配置验证的规则
 * rules:{
 *   checkFun:配置验证方法
 *   regex: 配置验证规则
 *   message:配置验证给出的提示信息
 * }
 * checkFun 和 regex 为可选项 两者必须有一个
 * 存在 checkFun 使用配置的方法进行验证
 * 存在 regex 使用配置的验证规则进行验证
 * 同时存在 checkFun 和 regex 的时候，优先使用 checkFun来验证
 */
/* 使用 axios */
Vue.prototype.axios = axios;
Vue.prototype.required = null;
Vue.prototype.email = null;
Vue.prototype.phone = null;
Vue.prototype.min = function(){};
Vue.prototype.max = function(){};
Vue.prototype.between = function(){};
Vue.prototype.minlength = function(){};
Vue.prototype.maxlength = function(){};
Vue.prototype.regex = function(){};
Vue.prototype.remote = function(){};
const defaultRules = {
    required:{
        checkFun:required, // 验证方法
        regex:'',// 验证规则
        message:'我不能为空' // 提示信息
    },
    email:{
        checkFun:email,
        regex:/^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$/,
        message:"请输入正确的邮箱地址"
    },
    phone:{
        checkFun:phone,
        regex:/^[1][3,4,5,7,8][0-9]{9}$/,
        message:'请输入正确的手机号码'
    },
    // 函数验证
    min:{
        checkFun:min,
        message:'最小值不能小于'
    },
    max:{
        checkFun:max,
        message:'最大值不能大于'
    },
    between:{
        checkFun:between,
        message:''
    },
    minlength:{
        checkFun:minlength,
        message:'最小长度为'
    },
    maxlength:{
        checkFun:maxlength,
        message:'最小长度为'
    }
};
const rules = Object.assign(defaultRules,userRules);
// 验证是否是 required
function required(value){
    if(empty(value)){return false;};
    return true;
};
// 验证是否是 email
function email(value){
    if(empty(value)){return true;};
    return /^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$/.test(value);
};
// 验证是否是 phone
function phone(value){
    if(empty(value)){return true;};
    return /^[1][3,4,5,7,8][0-9]{9}$/.test(value);
};
/*
 * min(value,obj)
 * value 是要进行验证的值
 * obj 是要进行验证的最小值对象
 */
function min(value,obj){
    if(empty(value)){return true;};
    value = parseFloat(value);
    // 判断输入的是一个数字
    if(!number(value)){
        rules.min.message = "请输入一个数字";
        return false;
    };
    // 判断最小值
    if(value < obj[0]){
        rules.min.message = "最小值不能小于"+obj[0];
        return false;
    };
    return true;
};
/*
 * max(value,obj)
 * value 要进行验证的值
 * obj 要进行验证的最大值对象 
 */
function max(value,obj){
    if(empty(value)){return true;};
    value = parseFloat(value);
    if(!number(value)){
        rules.max.message = "请输入一个数字";
        return false;
    };
    // 判断最大值
    if(value > obj[0]){
        rules.max.message = "最大值不能大于"+obj[0];
        return false;
    };
    return true;
};
/*
 * between(value,obj)
 */
function between(value,obj){
    if(empty(value)){return true;};
    value = parseFloat(value);
    if(!number(value)){
        rules.between.message = "请输入一个数字";
        return false;
    };
    // 判断区间
    if(value < obj[0] || value > obj[1]){
        rules.between.message = "请输入["+obj[0]+","+obj[1]+"]范围的值";
        return false;
    };
    return true;
};
/*
 * minlength(value,obj)
 */
function minlength(value,obj){
    if(empty(value)){return true;};
    if(value.length < obj[0]){
        rules.minlength.message = "最小长度不能小于"+obj[0];
        return false;
    };
    return true;
};
/*
 * maxlength(value,obj)
 */
function maxlength(value,obj){
    if(empty(value)){return true;};
    if(value.length > obj[0]){
        rules.maxlength.message = "最大长度不能大于"+obj[0];
        return false;
    };
    return true;
};
// 返回是否是数字 小数
function number(value){
    return /^\d+(\.\d+)?$/.test(value);
};
// 判断是否为空
function empty(value){
    if(value == "" || value == null){
        return true;
    };
    return false;
};
/**********************************************/
/*
 * 提取公用方法
 */
/*
 * 封装 axiosPost 方法
 */
function axiosPost(url,data,fun){
  axios({
    method:'post',
    url:url,
    data:data,
    headers:{'Content-Type': 'application/x-www-form-urlencoded'},
    transformRequest: function(obj) {  
        var str = [];  
        for(var p in obj){  
          str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));  
        }
        return str.join("&");  
    }
  }).then((res)=>{fun(res);});
};
/*
 * 获取字节长度的方法
 */
function getByteLen(val) {
  let len = 0;
  for(let i = 0; i < val.length; i++){        
    if(val[i].match(/[^\x00-\xff]/ig) != null){
      len += 2;
    }else{
      len += 1;
    };
  }
  return len;
};
/*
 * 封装 addClass 添加类名
 */
function addClass(obj, cls){
    let obj_class,blank,added;
    obj_class = obj.className;//获取 class 内容.
    blank = (obj_class != '') ? ' ' : '';//判断获取到的 class 是否为空, 如果不为空在前面加个'空格'.
    added = obj_class + blank + cls;//组合原来的 class 和需要添加的 class.
    obj.className = added;//替换原来的 class.
}
/*
 * 封装 removeClass 方法
 */
function removeClass(obj, cls){
    let obj_class,removed;
    obj_class = ' '+obj.className+' ';//获取 class 内容, 并在首尾各加一个空格. ex) 'abc    bcd' -> ' abc    bcd '
    obj_class = obj_class.replace(/(\s+)/gi, ' '),//将多余的空字符替换成一个空格. ex) ' abc    bcd ' -> ' abc bcd '
    removed = obj_class.replace(' '+cls+' ', ' ');//在原来的 class 替换掉首尾加了空格的 class. ex) ' abc bcd ' -> 'bcd '
    removed = removed.replace(/(^\s+)|(\s+$)/g, '');//去掉首尾空格. ex) 'bcd ' -> 'bcd'
    obj.className = removed;//替换原来的 class.
}
/*
 * 封装 hasClass 方法
 */
function hasClass(obj, cls){
    let obj_class,obj_class_lst;
    obj_class = obj.className,//获取 class 内容.
    obj_class_lst = obj_class.split(/\s+/);//通过split空字符将cls转换成数组.
    x = 0;
    for(x in obj_class_lst) {
        if(obj_class_lst[x] == cls) {//循环数组, 判断是否包含cls
            return true;
        }
    }
    return false;
}
// 添加提示提示
function msg(msgs,time=null){
    let msgBox = document.createElement("div");
    let msgId = Date.parse(new Date());
    let stopTime = time ? time : 1500;
    msgBox.innerText = msgs;  
    msgBox.id = msgId;
    msgBox.setAttribute('style','position:fixed; background:rgba(0,0,0,0.6); font-size:16px; color:#fff; padding:10px 16px 12px; text-align:center; left:50%; top:40%; border-radius:5px; margin-left:'+'-'+((Math.ceil(getByteLen(msgs))/2)*16+32)/2+'px;');      
    document.body.appendChild(msgBox);
    setTimeout(function(){
        document.getElementById(msgId).remove();
    },stopTime);
}
export {rules,common,axios,getByteLen,axiosPost,msg,addClass,removeClass,hasClass}
